package pruebas;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;
import src.*;

import org.junit.Test;

public class PruebaCasamentera extends TestCase{
	

	private TablaDePreferencias preferenciasHombres, preferenciasMujeres;
	private ArrayList<Persona> hombres;
	private ArrayList<Persona> mujeres;
	

	public void setUp(){

		
		this.preferenciasHombres = new TablaDePreferencias();
		this.preferenciasMujeres = new TablaDePreferencias();

		this.hombres = new ArrayList<Persona>();
		this.mujeres = new ArrayList<Persona>();
		
		this.preferenciasHombres.agregarPersona(new Persona("Rogelio"));
		this.preferenciasHombres.agregarPersona(new Persona("Aureliano"));
		this.preferenciasHombres.agregarPersona(new Persona("Jose"));
		this.preferenciasHombres.agregarPersona(new Persona("Nicolas"));
		this.preferenciasHombres.agregarPersona(new Persona("Pablo"));
		this.preferenciasHombres.agregarPersona(new Persona("Roberto"));
		this.preferenciasHombres.agregarPersona(new Persona("Arnaldo"));
		this.preferenciasHombres.agregarPersona(new Persona("Julian"));
		
		
		Iterator<Persona> it= this.preferenciasHombres.getPersonas();
		while(it.hasNext()){
			this.hombres.add(it.next());
		}
		
		
		this.preferenciasMujeres.agregarPersona(new Persona("Roxana"));
		this.preferenciasMujeres.agregarPersona(new Persona("Josefina"));
		this.preferenciasMujeres.agregarPersona(new Persona("Gabriela"));
		this.preferenciasMujeres.agregarPersona(new Persona("Lucia"));
		this.preferenciasMujeres.agregarPersona(new Persona("Susana"));
		this.preferenciasMujeres.agregarPersona(new Persona("Ana"));
		this.preferenciasMujeres.agregarPersona(new Persona("Mariana"));
		this.preferenciasMujeres.agregarPersona(new Persona("Agustina"));
		
		
		it= this.preferenciasMujeres.getPersonas();
		while(it.hasNext()){
			this.mujeres.add(it.next());
		}
		
		cargar(hombres,mujeres);
		cargar(mujeres,hombres);
		
		
		
		
		
		
		
		
	}
	

	private void cargar(ArrayList<Persona> personas, ArrayList<Persona> personasPreferidas) {
		
		
		List<Persona> personasMezcladas= new ArrayList<Persona>(personasPreferidas);
		Iterator<Persona> itPersonas = personas.iterator();
		while(itPersonas.hasNext())
		{
			Persona persona = itPersonas.next();
			
			Collections.shuffle(personasMezcladas);
			Iterator<Persona> itPersonasMezcladas= personasMezcladas.iterator();
			while(itPersonasMezcladas.hasNext()){
				persona.agregarPreferenciaSiguiente(itPersonasMezcladas.next());
			}
		
		
		}
		
			
	}


	@Test
	public void testGS() {
		casaryVerificar(new CasamenteraGaleAndShapley(this.preferenciasHombres,this.preferenciasMujeres));
	}
	
	public void testFB(){
		casaryVerificar(new CasamenteraGaleAndShapley(this.preferenciasHombres,this.preferenciasMujeres));
	}
	
	private void casaryVerificar(Casamentera casamentera){
		casamentera.casar();

		TestCase.assertTrue(casamentera.seCasaron());

		Iterator<Persona> itHombres = this.hombres.iterator();
	
			
		while(itHombres.hasNext()){
			Iterator<Persona> itMujeres = this.mujeres.iterator();
			Persona hombre= itHombres.next();
			while(itMujeres.hasNext()){
				Persona mujer= itMujeres.next();
				TestCase.assertTrue(hombre.esEstableCon(mujer));
				
			}
			
			
		}


	
	}

	

}
